package com.jacky.双指针;

public class 最长回文子串_5 {

    int[] range = new int[2];

    public String longestPalindrome(String s) {
        if (s == null || s.length() <= 1) return s;
        int length = s.length();
        //把字符串转换为字符数组
        char[] chs = s.toCharArray();
        for (int i = 1; i < length; i++) {
            //中心为奇数的情况
            process(chs, length, i, i);
            //中心为偶数的情况
            process(chs, length, i - 1, i);
        }
        return s.substring(range[0], range[1]);
    }

    public void process(char[] chs, int length, int left, int right) {
        //左右两边同时满足没到边界值，要继续向两边扩展
        while (left >= 0 && right <= length - 1) {
            if (chs[left] == chs[right]) {
                //向左扩展
                left--;
                //向右扩展
                right++;
            } else {
                break;
            }
        }
        /**
         * 开始计算最长回文下标，这里说明下，为啥range[0]要等于start+1,因为上面循环判断左右两个字符不
         * 相等的时，才跳出，这时候start加回去,为啥不用end-1呢，因为substring方法时，求子串时,是左闭，右开的[a,b)，所以不用减回去
         */
        if (right - (left + 1) > range[1] - range[0]) {
            range[0] = left + 1;
            range[1] = right;
        }
    }
}
